Спринт 1/18 → Тема 6/13: Последовательности: продолжение → Урок 1/2
List. Работа со списками
Списки в Python — отличный инструмент для работы с наборами значений; арсенал возможностей при работе со списками весьма велик.
Списки — упорядоченные изменяемые коллекции объектов произвольных типов.
- Изменяемые: при изменении числа элементов списка или их значений изменяется сам объект в памяти, а не создаётся новый.
- Упорядоченные: каждому элементу списка присваивается порядковый номер — индекс. По индексу можно получить доступ к значению элемента списка.
Объявить список можно несколькими способами.
Объявление списка функцией list()
Любой итерируемый объект можно преобразовать в список функцией
list().PYTHON
Литерал
Литералами в программировании называют значения, включённые прямо в код программы. Литерально можно объявить переменную любого встроенного типа:
PYTHON
Списковое включение (List comprehension)
List comprehension — это сокращённая форма записи программного кода, создающая список на основе заданных правил и условий.
Термин List comprehension иногда переводят как «генератор списков», но этот перевод не совсем корректен: в Python есть отдельное понятие «генератор», в результате возникает терминологическая путаница. Распространён перевод «списковое включение» — он встречается в статьях и в документации. Мы будем применять английское название.
Напишем код программы, которая работает с данными из онлайн-кинотеатра и накручивает рейтинги всем фильмам. На вход программа получает список рейтингов
movie_ratings, каждой оценке из списка добавляет 0.2 балла и записывает результат в новый список.PYTHON
Запись через list comprehension будет гораздо короче:
PYTHON
Выглядит намного лучше: вместо четырёх строк кода получаем всего одну.
Чтобы на выходе получился список — код заключается в квадратные скобки, это литералы списка.
Внутри квадратных скобок можно выделить три части:
- Значение элемента нового списка: значение из исходного списка, увеличенное на 0.2.
- Обрабатываемый объект: переменная, в которую по очереди, как в цикле, передаются значения всех элементов списка:
rating. - Источник, из которого получаем значения элементов: список
movie_ratings.
Части отделены друг от друга ключевыми словами
for и in.Создайте список целых чисел
1, 4, 9, 16, 25, 36, 49, 64, 81, 100 используя списковое включение. В качестве источника значений используйте range()КодPYTHON
Условия в list comprehension
Сейчас программа увеличивает рейтинг фильма на 0.2, даже если он имеет максимальное значение 5.
Чтобы избежать превышения предельно возможного рейтинга (шкала-то пятибалльная) в списковое включение можно добавить условие, тернарный оператор:
PYTHON
Такая запись как пишется — так и читается: «добавь в новый список
rating + 0.2, если rating < 4.9, иначе добавь rating» .Если задача будет в том, чтобы сформировать список только из значений рейтинга, которые больше 4.5, тогда нужно использовать только оператор
if; list comprehension будет выглядеть так:PYTHON
Распаковка списка
Это удобная операция, благодаря которой возможно одним выражением присвоить значения элементов списка переменным.
PYTHON
Но стоит обратить внимание на число переменных и распаковываемых элементов: если их количество будет отличаться — возникнет ошибка:
PYTHON
Методы списков
Списки — это изменяемый тип данных, поэтому методы изменяют сам объект списка к которому применены, а не создают новый.
list.append(element) — добавляет элемент в конец списка.
PYTHON
Метод
append() ничего не возвращает, он не создаёт новый объект, а изменяет существующий. Потому не следует присваивать результат применения метода переменной: метод ничего не возвращает, и в результате значением такой переменной окажется None.PYTHON
list_1.extend(list_2) — расширяет список
list_1, добавляя в конец все элементы списка list_2. Визуально результат метода похож на результат конкатенации списков. Разница состоит в том, что:- при конкатенации создаётся новый объект, содержащий элементы двух списков;
- метод
extend()изменяет списокlist_1.
PYTHON
При конкатенации создан новый объект, и теперь переменная
movies ссылается на него.list.insert(index, value):
- подставляет элемент со значением
valueна позициюindex; - увеличивает индекс элементов, начиная от
index, на единицу.
PYTHON
list.remove(value) — удаляет первый (при чтении списка слева направо) элемент, значение которого совпадает с аргументом. Если такого элемента нет в списке — будет вызвано исключение.
PYTHON
list.pop(index) — удаляет из списка элемент с индексом
index и возвращает его. Если индекс не указан, метод удаляет и возвращает последний элемент списка.PYTHON
list.index(value, start , end) — читает список слева направо и возвращает индекс первого найденного элемента со значением
value. Диапазон поиска можно ограничить индексами start и end.Если элемент с заданным значением не найден — будет выведено исключение ValueError.
PYTHON
list.count(value) — возвращает количество элементов со значением
value.PYTHON
list.sort() — сортирует список . У этого метода есть необязательный параметр
reverse , определяющий направление сортировки. По умолчанию reverse = False, элементы сортируются «по возрастанию», от меньшего к большему.PYTHON
list.reverse() — инвертирует список. Результат работы метода похож на использование среза [::-1], но в отличие от среза этот метод не создаёт новый объект списка.
PYTHON
Метод
reverse() изменил исходный список. Если использовать для разворота срез, то результатом будет новый объект.PYTHON
list.copy() — возвращает новый список, независимую копию исходного списка.
PYTHON
Если просто присвоить переменной
copy_movie_ratings значение movie_ratings (copy_movie_ratings = movie_ratings) — копия не создастся: обе переменные будут ссылаться на один объект.list.clear() — очищает список, удаляет из него все элементы:
PYTHON
Теперь вы знаете, как управляться со списками. Пора закрепить на практике!
Магистр Йода состарился и стал совсем плох в речи: он стал менять местами первое и последнее слово фразы. Напишите программу, которая сможет привести его фразы в нормальный вид. Не создавая нового объекта, поменяйте первое и последнее слово местами.
КодPYTHON